package cn.iocoder.yudao.module.promotion.service.updateorder;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import cn.iocoder.yudao.module.promotion.controller.admin.updateorder.vo.*;
import cn.iocoder.yudao.module.promotion.dal.dataobject.updateorder.UpdateOrderDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

import cn.iocoder.yudao.module.promotion.dal.mysql.updateorder.UpdateOrderMapper;

import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;

/**
 * 升级订单 Service 实现类
 *
 * @author 芋道源码
 */
@Service
@Validated
public class UpdateOrderServiceImpl implements UpdateOrderService {

    @Resource
    private UpdateOrderMapper updateOrderMapper;

    @Override
    public Long createUpdateOrder(UpdateOrderSaveReqVO createReqVO) {
        // 插入
        UpdateOrderDO updateOrder = BeanUtils.toBean(createReqVO, UpdateOrderDO.class);
        updateOrderMapper.insert(updateOrder);
        // 返回
        return updateOrder.getId();
    }

    @Override
    public void updateUpdateOrder(UpdateOrderSaveReqVO updateReqVO) {
        // 校验存在
        validateUpdateOrderExists(updateReqVO.getId());
        // 更新
        UpdateOrderDO updateObj = BeanUtils.toBean(updateReqVO, UpdateOrderDO.class);
        updateOrderMapper.updateById(updateObj);
    }

    @Override
    public void deleteUpdateOrder(Long id) {
        // 校验存在
        validateUpdateOrderExists(id);
        // 删除
        updateOrderMapper.deleteById(id);
    }

    private void validateUpdateOrderExists(Long id) {
        if (updateOrderMapper.selectById(id) == null) {
            throw exception(UPDATE_ORDER_NOT_EXISTS);
        }
    }

    @Override
    public UpdateOrderDO getUpdateOrder(Long id) {
        return updateOrderMapper.selectById(id);
    }

    @Override
    public PageResult<UpdateOrderDO> getUpdateOrderPage(UpdateOrderPageReqVO pageReqVO) {
        return updateOrderMapper.selectPage(pageReqVO);
    }

    @Override
    public List<UpdateOrderDO> getUpdateOrderList(UpdateOrderPageReqVO pageReqVO) {

        LambdaQueryWrapper<UpdateOrderDO> wrapper = new LambdaQueryWrapper<>();

        if (null != pageReqVO.getMemberMobile() && StringUtils.isNotBlank(pageReqVO.getMemberMobile())) {
            wrapper.eq(UpdateOrderDO::getMemberMobile, pageReqVO.getMemberMobile());
        }
        if (null != pageReqVO.getCurDate() && StringUtils.isNotBlank(pageReqVO.getCurDate())) {
            wrapper.apply("DATE_FORMAT( create_time, '%Y-%m-%d' ) = '" + pageReqVO.getCurDate() + "'");
        }
        if (null != pageReqVO.getStatus() && StringUtils.isNotBlank(pageReqVO.getStatus())) {
            wrapper.eq(UpdateOrderDO::getStatus, pageReqVO.getStatus());
        }
        if (null != pageReqVO.getPayer() && StringUtils.isNotBlank(pageReqVO.getPayer())) {
            wrapper.eq(UpdateOrderDO::getPayer, pageReqVO.getPayer());
        }
        wrapper.eq(UpdateOrderDO::getDeleted, 0);
        wrapper.orderByDesc(UpdateOrderDO::getCreateTime);

        return updateOrderMapper.selectList(wrapper);
    }

}